# ===================================算术运算符===================================
print("===================================算术运算符===================================")
a = 10
b = 3
print(a - b)
print(a + b)
print(a * b)
print(a / b)
print(a // b)  # 整除，取整
print(a % b)  # 取余，求模
print(a ** b)  # 幂运算

# 优先级 `**` > `* / % //` > `+ -`
print(1 + 2 * 5 ** 2)  # 1 + 2 * (5 ** 2)

# ==================================赋值运算符===================================
print("===================================赋值运算符===================================")
a = 8
print(a)
a += 2
print(a)  # a = a + 2
a -= 3
print(a)
a *= 2
print(a)
a /= 6
print(a)
b = 10
b //= 3
print(b)
c = 10
c %= 3
print(c)
d = 2
d **= 4
print(d)

# ==================================比较运算符===================================
print("===================================比较运算符===================================")
# ==  !=  >  <  >=  <=
print(1 == 1)
print(1.0 == 1)
print(True == False)
print("pava" == "java")

print(1 != 1)

print(1 > 2)
print(1 < 2)
print("jiva" < "java")  # 挨个字符进行比较：每个字符ascii码值

print(1 >= 1)
print(1 <= 1)

# ord()函数查看ascii码值
print(ord("p"), ord("j"))

# ==================================逻辑运算符===================================
print("===================================逻辑运算符===================================")
# and/or/not
print(True and False)
print("" and "hi")  # hello 短路运算
print(False and "hi")

print(True or False)
print(1 or 0)
print(0 or 1 or 0)

print(not True)
print(not 1)
print(not '')

# 优先级 not > and >or
print(True and not False)
print(True or '' and False or not False)

# ==================================位运算符===================================
print("===================================位运算符===================================")
# 按位与 &
'''
00000101
00000111
--------
00000101
'''
print(5 & 7)  # 5
# 按位或 |
'''
00000011
00000100
--------
00000111
'''
print(3 | 4)
# 按位抑或 ^ (相同位0，不同位1)
'''
00000010
00001000
--------
00001010
'''
print(2 ^ 8)
# 按位取反 ~ (补码)
# 步骤：原码 -> 补码 -> 按位取反 -> 原码
'''
正数的反码、补码与原码相同
负数
反码：原码基础上，符号位不变，其他位取反
补码：原码基础上，符号位不变，取余各位取反后加1
'''
'''
5的原码为：00000101
5的补码为：00000101
按位取反：11111010
原码：负数的原码是减一再取反
     减一：11111001
     取反：10000110
'''
print(~5)  # -6 => 正数：~n = - (n + 1)
'''
-5的原码为：10000101
-5的补码为：11111011   补码：除符号位全部取反，最低位+1
按位取反：00000100
原码：正数原码、补码、反码一致
     00000100
'''
print(~(-5))  # 4 => 负数：~n = |n + 1|

# ==================================移位运算符===================================
print("===================================移位运算符===================================")
'''
101
10100
'''
print(6 << 2)  # 左移，24  乘2**2
'''
110
001
'''
print(9 >> 2)  # 右，2 整除2**2




# ==================================成员运算符===================================
print("===================================成员运算符===================================")
# in 在指定的序列里找，找到就是true，否则false
print("12" in "123")
# not in 和in相反
print("star" not in "super star")




# ==================================身份运算符===================================
print("===================================身份运算符===================================")
# is 判断两个标示符是否是同一个对象，是返回真，否则返回假
print(a is b)
# is not 和is相反
print(a is not b)




# ==================================优先级===================================
print("===================================优先级===================================")
'''
运算符                        描述
**                           幂
~ + -                        按位取反，一元运算符（正负号）
* / % //                     乘、除、取余、整除
+ -                          加法、减法
<< >>                        左移、右移
&                            按位与
^ |                          按位异或、按位或
> < >= <=                    比较运算符
== !=                        等于、不等于
= += -= *= /= %= //= **=     赋值运算符
is  is not
in  not in
not or and                   逻辑运算符
'''